package main

import "fmt"

// 数组  是值类型
//值类型是浅拷贝  --新开辟内存
//引用类型是深拷贝 --指针指向，不新开内存

// 存放元素的容器
// 必须指定存放元素的类型和长度
// 数组长度是类型的一部分

func main() {
	// 数组声明
	var arr1 [3]bool //长度为3的bool类型 [false true true]
	var arr2 [4]bool //长度为4的bool类型 [false true true false]  arr1和arr2不能比较
	fmt.Printf("arr1:%T arr2:%T\n", arr1, arr2)

	// 数组的初始化
	// 如果不初始化，默认元素都是零值（bool=false，整型和浮点型都是0，字符串是""）
	fmt.Println(arr1, arr2)
	// 初始化方式1
	arr3 := [3]bool{true, false, true}
	fmt.Println(arr3)
	// 初始化方式2 根据初始值自动推导长度
	arr4 := [...]int{0, 1, 2, 1, 2, 3, 4, 12, 3}
	fmt.Println(arr4)
	// 初始化方式3,根据索引初始化，其他位置默认值
	arr5 := [5]int{0: 1, 4: 2}
	fmt.Println(arr5)

	// 数组遍历
	citys := [...]string{"北京", "深圳", "上海"}
	// 1. 根据索引遍历
	for i := 0; i < len(citys); i++ {
		fmt.Println(citys[i])
	}
	// 2. for range 遍历
	for i, v := range citys {
		fmt.Println(i, v)
	}

	// 多维数组
	// 声明一个[[1 2] [3 4] [5 6]]
	var arr6 [3][2]int
	arr6 = [3][2]int{
		{1, 2},
		{3, 4},
		{5, 6},
	}
	fmt.Println(arr6)

	// 值类型
	/*	array1:[1 2 3 4]
		array2:[1 2 3 4]
		array1:[100 2 3 4]
		array2:[1 2 3 4]	*/
	array1 := [...]int{1, 2, 3, 4}
	fmt.Printf("array1:%d\n", array1)
	array2 := array1
	fmt.Printf("array2:%d\n", array2)
	array1[0] = 100
	fmt.Printf("array1:%d\n", array1)
	fmt.Printf("array2:%d\n", array2)

}
